package com.bdqn.t382.controller;

import com.bdqn.t382.pojo.Account;
import com.bdqn.t382.pojo.Page;
import com.bdqn.t382.pojo.TransactionRecord;
import com.bdqn.t382.service.AccountService;
import com.bdqn.t382.util.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 账户控制器
 */
@Controller
@RestController
@RequestMapping("/api")
public class AccountController {

    private static final Logger logger = LoggerFactory.getLogger(AccountController.class);

    @Autowired
    private AccountService accountService;

    /**
     * 登录接口
     *
     * @param cardno   卡号
     * @param password 密码
     * @return 登录结果
     */
    @RequestMapping("/login")
    public R login(@RequestParam String cardno, @RequestParam String password) {
        logger.info("开始处理登录请求，卡号：{}", cardno);
        // 校验参数
        checkLoginParams(cardno, password);
        try {
            Account account = accountService.login(cardno, password);
            logger.info("登录成功，卡号：{}", cardno);
            return R.ok(account);
        } catch (Exception e) {
            logger.error("登录失败，卡号：{}，错误信息：{}", cardno, e.getMessage());
            // 返回给客户端的错误信息进行简化处理
            return R.error("登录失败，请检查卡号或密码");
        }
    }

    /**
     * 查询余额接口
     *
     * @param cardno 卡号
     * @return 余额信息
     */
    @PostMapping("/balance")
    public R getBalance(@RequestParam String cardno) {
        logger.info("开始处理查询余额请求，卡号：{}", cardno);
        // 校验卡号
        checkCardno(cardno);
        try {
            Double balance = accountService.getBalance(cardno);
            logger.info("查询余额成功，卡号：{}，余额：{}", cardno, balance);
            return R.ok(balance);
        } catch (Exception e) {
            logger.error("查询余额失败，卡号：{}，错误信息：{}", cardno, e.getMessage());
            return R.error("查询余额失败");
        }
    }

    //修改密码接口
    @PostMapping("/updatePassword")
    public R updatePassword(@RequestParam String cardno, @RequestParam String oldPassword, @RequestParam String newPassword) {
        logger.info("开始处理修改密码请求，卡号：{}", cardno);
        //检查卡号是否正确
        checkCardno(cardno);
        // 校验新密码
        checkPassword(newPassword);
        try {
            // 假设 accountService.updatePassword 是修改密码的方法
            accountService.updatePassword(cardno, oldPassword, newPassword);
            logger.info("修改密码成功，卡号：{}", cardno);
            return R.ok("密码修改成功");
        } catch (Exception e) {
            logger.error("修改密码失败，卡号：{}，错误信息：{}", cardno, e.getMessage());
            return R.error("修改密码失败");
        }
    }

    //判断账户是否存在接口
    @PostMapping("/isAccountExist")
    public R isAccountExist(@RequestParam String cardno) {
        checkCardno(cardno);
        logger.info("开始处理判断账户是否存在请求，卡号：{}", cardno);
        try {
            boolean exist = accountService.isAccountExist(cardno);
            // 返回给客户端的错误信息进行简化处理
            if (!exist) {
                return R.error("账户不存在");
            } else {
                return R.ok();
            }
        } catch (Exception e) {
            logger.error("判断账户是否存在失败，卡号：{}，错误信息：{}", cardno, e.getMessage());
            return R.error("判断账户是否存在失败");
        }
    }

    //转账接口
    @PostMapping("/transfer")
    public R update(@RequestBody Account account) {
        int num = accountService.transfer(account);
        if (num < 0) {
            return R.fail();
        } else {
            return R.ok(account);
        }
    }

    //转账之后添加交易记录
    @RequestMapping("/add")
    public R add(@RequestBody TransactionRecord transactionRecord) {
        int num = accountService.addAccount(transactionRecord);
        if (num < 0) {
            return R.fail();
        } else {
            return R.ok(transactionRecord);
        }
    }


    //根据起始时间和终止时间分页查询交易记录
    @PostMapping("/selectTransactionRecords")
    public R page(@RequestParam String cardno,
                  @RequestParam(value = "startDate",defaultValue = "") Date startDate,
                  @RequestParam(value = "endDate",defaultValue = "") Date endDate,
                  @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
                  @RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize) {
        Page page = accountService.getPage(cardno,startDate, endDate, pageNo, pageSize);
        if (page.getList() == null || page.getList().size() == 0) {
            return R.fail();
        } else {
            return R.ok(page);
        }
    }


    //根据卡号查询账户信息
    @PostMapping("/selectByCardno")
    public R selectByCardno(@RequestParam String cardno) {
        checkCardno(cardno);
        logger.info("开始处理查询账户信息请求，卡号：{}", cardno);
        try {
            Account account = accountService.selectByCardno(cardno);
            logger.info("查询账户信息成功，卡号：{}", cardno);
            return R.ok(account);
        }catch (Exception e){
            logger.error("查询账户信息失败，卡号：{}，错误信息：{}", cardno, e.getMessage());
            return R.error("查询账户信息失败");
        }
    }



    /**
     * 校验登录参数
     *
     * @param cardno   卡号
     * @param password 密码
     */
    private void checkLoginParams(String cardno, String password) {
        // 校验卡号
        checkCardno(cardno);
        // 校验密码
        if (password == null || password.trim().isEmpty()) {
            logger.warn("密码为空");
            throw new IllegalArgumentException("密码不能为空");
        }
        // 校验密码复杂度
        checkPassword(password);
    }

    /**
     * 校验卡号
     *
     * @param cardno 卡号
     */
    private void checkCardno(String cardno) {
        if (cardno == null || cardno.trim().isEmpty()) {
            logger.warn("卡号为空");
            throw new IllegalArgumentException("卡号不能为空");
        }
        // 校验卡号格式（假设卡号为数字）
        if (!Pattern.matches("\\d+", cardno)) {
            logger.warn("卡号格式不正确");
            throw new IllegalArgumentException("卡号格式不正确");
        }
        // 根据实际业务需求调整卡号长度校验
        if (cardno.length() != 16) {
            logger.warn("卡号长度不正确");
            throw new IllegalArgumentException("卡号长度不正确");
        }
    }

    /**
     * 校验密码复杂度
     *
     * @param password 密码
     */
    private void checkPassword(String password) {
        if (password == null || password.trim().isEmpty()) {
            logger.warn("密码为空");
            throw new IllegalArgumentException("密码不能为空");
        }
        if (password.length() < 6) {
            logger.warn("密码长度不足6位");
            throw new IllegalArgumentException("密码长度至少为6位");
        }
    }
}